package br.com.gbvbahia.projeto.entidades;

import br.com.gbvbahia.projeto.entidades.commons.EntityInterface;
import java.io.Serializable;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;

/**
 * Define o grupo ao qual o usuário pertence.
 * @author Guilherme
 * @since 2012/02/25
 */
@Entity
@Table(name = "access_group")
@XmlRootElement
@NamedQueries({
    @NamedQuery(name = "Grupo.findAll",
    query = "SELECT a FROM Grupo a"),
    @NamedQuery(name = "Grupo.findByGrupoId",
    query = "SELECT a FROM Grupo a WHERE a.grupoId = :grupoId"),
    @NamedQuery(name = "Grupo.findByDescription",
    query = "SELECT a FROM Grupo a WHERE a.description = :description"),
    @NamedQuery(name = "Grupo.findByUserDafeult",
    query = "SELECT a FROM Grupo a WHERE a.userDafeult = :userDafeult")
})
public class Grupo implements Serializable, EntityInterface<Grupo> {

    /**
     * Nome do grupo, o método de
     * Único por grupo.<br>
     * Não utiliza sequence.<br>
     * Não pode ser nulo.
     */
    @Id
    @NotNull
    @Size(min = 1, max = 50)
    @Column(name = "grupo_id", length = 50)
    private String grupoId;
    /**
     * String com pequena descrição sobre o grupo.
     */
    @NotNull
    @Size(min = 1, max = 50)
    @Column(name = "description", nullable = false, length = 50)
    private String description;

    /**
     * Quando um usuário é cadastrado, os grupos que forem marcados como true
     * será incluídos automaticamente no usuário a ser cadastrado.<br>
     * Logicamente que no momento do cadastro esses grupos poderão
     * ser alterados conforme necessidade.<br>
     *  <strong>Não existe implementação para verificar essa informação
     * no momento.</strong>
     */
    @Column(name = "user_dafeult", nullable = false)
    private boolean userDafeult = false;

    /**
     * Construtor padrão.
     */
    public Grupo() {
    }

    /**
     * Construtor que recebe a String que será o Id do grupo.
     * @param grupo java.lang.String
     */
    public Grupo(final String grupo) {
        this.grupoId = grupo;
    }

    /**
     * GrupoId do grupo.
     * @return java.lang.String
     */
    public String getGrupoId() {
        return grupoId;
    }

    /**
     * Altera o grupoId, se já estiver salvo no banco de dados esse valor
     * não pode ser alterado.<br>
     * Campo obrigatório.
     * @param grupo java.lang.String
     */
    public void setGrupoId(final String grupo) {
        this.grupoId = grupo;
    }

    /**
     * Recupera a descrição do gruopo.
     * @return java.lang.String
     */
    public String getDescription() {
        return description;
    }

    /**
     * Altera a descrição do grupo.<br>
     * Campo obrigatório.
     * @param desc String
     */
    public void setDescription(final String desc) {
        this.description = desc;
    }

    /**
     * Verifica se é um grupo default.
     * @return boolean.
     */
    public boolean getUserDafeult() {
        return userDafeult;
    }

    /**
     * Altera se o grupo é default.
     * @param user boolean.
     */
    public void setUserDafeult(final boolean user) {
        this.userDafeult = user;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (grupoId != null ? grupoId.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(final Object object) {
        if (!(object instanceof Grupo)) {
            return false;
        }
        Grupo other = (Grupo) object;
        if ((this.grupoId == null 
                && other.grupoId != null) 
                || (this.grupoId != null 
                && !this.grupoId.equals(other.grupoId))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return grupoId;
    }

    @Override
    public Serializable getId() {
        return getGrupoId();
    }

    @Override
    public String getLabel() {
        return getGrupoId();
    }

    @Override
    public boolean verificarId() {
        return true;
    }

    @Override
    public int compareTo(final Grupo o) {
        return this.grupoId.compareTo(o.grupoId);
    }
}
